package com.somedemo.java_design_patterns_demo.single;

//单例模式 懒汉式: 会有线程安全问题,当多线程情况下,同时获取到为空有可能会创建多个对象
//解决办法可以加锁.
public class SingleDemo1 {
    private static SingleDemo1 singleDemo1;

    private SingleDemo1() {
    }

    ;
    //线程不安全模式
//    public static SingleDemo1 getSingleDemo1() {
//        if (singleDemo1 == null) {
//            singleDemo1 = new SingleDemo1();
//        }
//        return singleDemo1;
//    }
    // 线程安全模式方法一:效率低,无论什么情况都是加锁
//        public static synchronized SingleDemo1 getSingleDemo1() {
//        if (singleDemo1 == null) {
//            singleDemo1 = new SingleDemo1();
//        }
//        return singleDemo1;
//    }


    // 线程安全模式方法二:效率高,先判断再加锁
    public static SingleDemo1 getSingleDemo1() {
        if (singleDemo1 == null) {
            synchronized (SingleDemo1.class) {
                if (singleDemo1 == null) {
                    singleDemo1 = new SingleDemo1();
                }
            }
        }
        return singleDemo1;
    }

    public static void main(String[] args) {
        SingleDemo1 singleDemo11 = new SingleDemo1();
        System.out.println(singleDemo11.getSingleDemo1());
        SingleDemo1 singleDemo12 = new SingleDemo1();
        System.out.println(singleDemo12.getSingleDemo1());
    }
}
